package collectionFrame;

import java.util.*;

public class Demo8_HashSet {

    /**
     * Set
     *   是 Collection 接口的子接口，表示的一个集合
     *   List 是有序可以重复的序列
     *   Set  是无序不可以重复的序列
     *     无序：不会按照添加元素的顺序显示元素,也不会排序，也不是随机产生的顺序
     *     不可以重复：在一个序列中，不能出现相同的两个元素
     *     原理：Set的内部实际上创建的就是一个相应Map
     *   常用的实现类
     *     HashSet
     *       使用
     *     TreeSet
     *       在Set的基础上，对元素进行排序
     *       使用的排序规则就是元素类型的默认比较规则
     *       如果使用自定义类型作为泛型，此类必须实现Comparable接口
     * Map：
     *   也是一个集合(一个数据类型中可以存放很多个元素数据)
     *   区别：List/Set 存储的都是独立的元素
     *        Map  以键值(Key-Value)对的形式存储数据 比如 name=tom
     *             key 表示的是当前对象的某一个属性的标识，比如 name , age , gender
     *             value 表示的是此key下的具体内容，比如 tom , 100 , 男
     *   原理
     *     HashMap
     *       hash:散列码 尽可能的把元素打乱，随机的存储
     *       底层是 数组+链表+红黑树
     *       初始数组长度为16，容量达到扩容因子(默认0.75)的时候，进行2倍扩容
     *       添加的元素按照key的hashCode值对桶数取余，余数是几就进第几个桶
     *       如果不同的key的hashCode值一样，就产生了哈希冲突(哈希碰撞)问题，在同一个位置以链表的形式继续存储
     *       如果一个桶中的链的元素数量达到了8个，此链就变成了红黑树结构
     *       如果hashCode值相同，内容(equals)也相同,可以判定是key重复。
     *       根据调用方法，可以对相同key的value值进行保留或替换
     *     TreeMap
     *       Tree是树的意思。底层的结构是一个树
     *       比当前节点小的元素放在当前节点的左子节点，比当前节点大的元素放在当前元素的又子节点
     *     HashTable(了解)
     *       早期版本的HashMap，继承了Dictionary类
     *       HashTable是线程安全的，Hashmap是线程不安全
     *       HashMap支持key和value都为null，HashTable是不支持
     */

    public static void useHashSet(){

        HashSet<Integer> hashSet = new HashSet<>();

        hashSet.add(1);
        hashSet.add(1);
        hashSet.add(10);
        hashSet.add(8);
        hashSet.add(3);
        hashSet.add(6);
        hashSet.add(80);
        hashSet.add(2);
        hashSet.add(1);
        hashSet.add(4);

        System.out.println(hashSet);

        hashSet.remove(6);
        System.out.println(hashSet);

        System.out.println(hashSet.contains(10));

        System.out.println(hashSet.isEmpty());

        HashSet<Integer> hashSet1 = (HashSet<Integer>)hashSet.clone();
        System.out.println(hashSet1);

        Iterator<Integer> iterator = hashSet.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

        hashSet.clear();
        System.out.println(hashSet);



    }


    public static void useTreeSet(){

        TreeSet<Integer> treeSet = new TreeSet<>();

        treeSet.add(6);
        treeSet.add(3);
        treeSet.add(80);
        treeSet.add(3);
        treeSet.add(12);
        treeSet.add(6);
        treeSet.add(5);

        System.out.println(treeSet);


        System.out.println(treeSet.headSet(7));
        System.out.println(treeSet.headSet(7, true));

        System.out.println(treeSet.tailSet(7));
        System.out.println(treeSet.tailSet(7,false));


        System.out.println(treeSet.subSet(5, 10));
        System.out.println(treeSet.subSet(5,false,10,false));


        System.out.println(treeSet.first());
        System.out.println(treeSet.last());

        //比当前元素小的所有元素中 最大的那一个，不包含当前元素
        System.out.println(treeSet.lower(6));
        //比当前元素小的所有元素中 最大的那一个，包含当前元素
        System.out.println(treeSet.floor(6));

        //比当前元素大的所有元素中 最小的那一个，不包含当前元素
        System.out.println(treeSet.higher(6));
        //比当前元素大的所有元素中 最小的那一个，包含当前元素
        System.out.println(treeSet.ceiling(6));

        System.out.println(treeSet.pollFirst());
        System.out.println(treeSet.pollLast());

    }

    public static void useHashMap(){
        HashMap<String, Object> hashMap = new HashMap<>();

        hashMap.put("name","tom");
        hashMap.put("age",100);
        hashMap.put("age",200);
        hashMap.put("gender",true);
        hashMap.put("gender",false);

        System.out.println(hashMap);

        hashMap.remove("age");
        System.out.println(hashMap);

        System.out.println(hashMap.get("gender"));

        System.out.println(hashMap.containsValue("tom"));

        System.out.println(hashMap.containsKey("name"));

        System.out.println(hashMap.isEmpty());

        hashMap.replace("name", "jerry");
        System.out.println(hashMap);

        hashMap.replace("name","jerry", "ztq");
        System.out.println(hashMap);

        hashMap.remove("name","aaa");
        System.out.println(hashMap);

        hashMap.putIfAbsent("gender",true);
        System.out.println(hashMap);


        System.out.println(hashMap.keySet());
        System.out.println(hashMap.values());


        Set<Map.Entry<String, Object>> entries = hashMap.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

    }

    public static void useTreeMap(){
        TreeMap<String, String> treeMap = new TreeMap<>();

        treeMap.put("name","tom");
        treeMap.put("age","100");
        treeMap.put("gender","boy");
        treeMap.put("id","001");

        System.out.println(treeMap);
    }


    public static void main(String[] args) {
        Demo8_HashSet.useTreeMap();
    }

}
